"""
Embeddings 工厂模块
支持多种 embedding 提供商（OpenAI、Ollama 等）
"""

from langchain_core.embeddings import Embeddings
from langchain_ollama import OllamaEmbeddings
from langchain_openai import OpenAIEmbeddings

from app.config import get_settings

settings = get_settings()


def get_embeddings() -> Embeddings:
    """
    根据配置创建 Embeddings 实例

    Returns:
        Embeddings: 嵌入模型实例

    Raises:
        ValueError: 不支持的 embedding 提供商
    """
    provider = settings.EMBEDDING_PROVIDER.lower()

    if provider == "ollama":
        print(f"📦 使用 Ollama Embeddings: {settings.EMBEDDING_MODEL}")
        print(f"   Ollama URL: {settings.OLLAMA_BASE_URL}")
        return OllamaEmbeddings(
            model=settings.EMBEDDING_MODEL,
            base_url=settings.OLLAMA_BASE_URL,
        )
    elif provider == "openai":
        print(f"📦 使用 OpenAI Embeddings: {settings.EMBEDDING_MODEL}")
        return OpenAIEmbeddings(
            model=settings.EMBEDDING_MODEL,
            api_key=settings.EMBEDDING_API_KEY,
            base_url=settings.EMBEDDING_BASE_URL,
        )

    raise ValueError(f"不支持的 embedding 提供商: {provider}. 请使用 'ollama'")


def test_embeddings() -> bool:
    """
    测试 embedding 是否正常工作

    Returns:
        bool: 是否成功
    """
    try:
        embeddings = get_embeddings()
        # 测试嵌入一个简单文本
        test_text = "这是一个测试"
        result = embeddings.embed_query(test_text)

        print("✅ Embedding 测试成功")
        print(f"   向量维度: {len(result)}")
        return True

    except Exception as e:
        print(f"❌ Embedding 测试失败: {str(e)}")
        return False
